package cn.zhx.xa.bi.manage;


import cn.zhx.xa.bi.propeties.SparkProperties;

import cn.zhx.xa.model.vo.common.ResultCodeEnum;
import cn.zhx.xa.service.exception.BusinessException;
import io.github.briqt.spark4j.SparkClient;
import io.github.briqt.spark4j.constant.SparkApiVersion;
import io.github.briqt.spark4j.model.SparkMessage;
import io.github.briqt.spark4j.model.SparkSyncChatResponse;
import io.github.briqt.spark4j.model.request.SparkRequest;
import io.github.briqt.spark4j.model.response.SparkTextUsage;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;


@Component
@Slf4j
public class AiManage {

    @Resource
    private SparkProperties sparkProperties;


    public String doChat(String message) {
        SparkClient sparkClient = new SparkClient();

        // 设置认证信息
        sparkClient.appid = sparkProperties.getAppid();
        sparkClient.apiKey = sparkProperties.getApiKey();
        sparkClient.apiSecret = sparkProperties.getApiSecret();

        // 消息列表，可以在此列表添加历史对话记录
        List<SparkMessage> messages = new ArrayList<>();
        messages.add(SparkMessage.systemContent("你是一个数据分析师和前端开发专家，接下来我会按照以下固定格式给你提供内容：\n" +
                "分析需求：\n" +
                "{数据分析的需求或者目标}\n" +
                "原始数据：\n" +
                "{csv格式的原始数据，用,作为分隔符}\n" +
                "请根据这两部分内容，严格按照以下指定格式生成内容（此外不要输出任何多余的东西）:\n" +
                "=====\n" +
                "{前端 Echarts V5 的 option 配置对象 JSON 代码,所有的属性名和值都使用双引号括起来，注意生成的图表内容不要重叠,不要生成任何多余的内容，比如注释和代码块标记}\n" +
                "=====\n" +
                "{明确的数据分析结论，不要生成多余的注释} \n" +
                "最终格式是:  ===== 前端代码 ===== 分析结论 \n"));
        messages.add(SparkMessage.userContent(message));
        // 构造请求
        SparkRequest sparkRequest = SparkRequest.builder()
                // 消息列表
                .messages(messages)
                // 模型回答的tokens的最大长度,非必传，默认为2048。
                // V1.5取值为[1,4096]
                // V2.0取值为[1,8192]
                // V3.0取值为[1,8192]
                .maxTokens(2048)
                // 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高 非必传,取值为[0,1],默认为0.5
                .temperature(0.5)
                // 指定请求版本，默认使用最新3.0版本
                .apiVersion(SparkApiVersion.V3_0)
                .build();


        // 同步调用
        SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
        if(chatResponse == null) throw new BusinessException(ResultCodeEnum.AI_ERROR);

        SparkTextUsage textUsage = chatResponse.getTextUsage();
        log.info("\n回答：" + chatResponse.getContent());
        log.info("\n提问tokens：" + textUsage.getPromptTokens()
                + "，回答tokens：" + textUsage.getCompletionTokens()
                + "，总消耗tokens：" + textUsage.getTotalTokens());

        return chatResponse.getContent();
    }




}
